/*
 * manejarDisco.h
 *
 *  Created on: 25/12/2011
 *      Author: utn_so
 */

#ifndef MANEJARPDD_H_
#define MANEJARPDD_H_

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include <stdint.h>
#include "protocolo_NIPC.h"
#include "semaf.h"
#include <fcntl.h>
#include "sock.h"
#include "config.h"


struct lstPed{
	int sector;
	int tipoAcceso;
	char buffer[512];
	int sock;
	struct ptrLstPed *sgte;
};

struct nodoCola {
    char* idPlanif;
    int cantLect;
    pthread_t thrPlanif;
    int socket;
    int completo;
    int pista;
    int cabeza;
    int sector;
    struct LstPedDup* pedDupInic;
    struct LstPedDup* pedDupFin;
    struct nodoCola *sgte;
};

struct lstPedDup{
	char* buffer;
	struct lstPedDup* sgte;
};

typedef struct nodoCola NodoCola;
typedef NodoCola *ptrNodoCola;
typedef struct lstPed LstPed;
typedef LstPed *ptrLstPed;
typedef struct lstPedDup LstPedDup;
typedef LstPedDup *ptrLstPedDup;

typedef struct pedido{
	int sector;
	char buffer[512];
	int sock;
	uint8_t tipoAcceso;
}pedido;

struct nodoMsj{
	char* mensaje;
	int sock;
	struct ptrMsj* sgte;
};
typedef struct nodoMsj NodoMsj;
typedef NodoMsj *ptrMsj;

typedef struct parMsjSock{
	char* msj;
	int sock;
	uint8_t tipoAcceso;
}parMsjSock;

int mutex1;
int mutexSock;
int mutexSectsGlob;
int cantDiscosComp;
int* sectores;
int terminoDisco;
int pistaRaid;
int sectorRaid;
int cabezaRaid;


int vaciaPDD(ptrNodoCola ptrCabeza);
int vaciaLect(ptrLstPed ptrCabeza);
void imprimirLstPDD(ptrNodoCola ptrActual);
char* quitarPDD(ptrNodoCola *ptrCabeza, ptrNodoCola *ptrTalon);
ptrNodoCola agregarPDD(ptrNodoCola *ptrCabeza, ptrNodoCola *ptrTalon, char* valor,int sock,pthread_t hilo,int,int,int);
ptrNodoCola buscarPDD(ptrNodoCola ptrCabeza,char* id);
void imprimirLstPed(ptrLstPed ptrActual);
pedido quitarPed(ptrLstPed *ptrCabeza,ptrLstPed *ptrTalon);
void agregarPed(ptrLstPed *ptrCabeza,ptrLstPed *ptrTalon, pedido sector);
ptrNodoCola distribuirLect(ptrNodoCola ptr,int sector,int tipo);
ptrNodoCola distribuirBloque(ptrNodoCola discos,int inic,int fin);
void redistribuirPeds(int** pedidos,int socket,ptrNodoCola discos);
int duplicarDisco(ptrNodoCola discos,int sectores);
void frenarDiscos(ptrNodoCola discos);
void escribirEnDiscos(ptrNodoCola discos,int sector,char* buffer);
int buscarDiscoCompleto(ptrNodoCola discos);
int buscarPed(ptrLstPed ptrCabeza,int sector);
ptrNodoCola buscarSock(ptrNodoCola ptrCabeza,int sock);
int buscarParaEliminar(ptrNodoCola* lista,int sock);
ptrNodoCola agregarFS(ptrNodoCola *ptrCabeza,ptrNodoCola *ptrTalon,int sock,pthread_t hilo);
ptrMsj agregarMsj(ptrMsj* ptrCabeza,ptrMsj* ptrTalon,char* msj,int sock);
parMsjSock quitarMsj(ptrMsj* ptrCabeza,ptrMsj* ptrTalon);
void agregarPedDup(ptrLstPedDup *ptrCabeza,ptrLstPedDup *ptrTalon,char* buffer);
char* quitarPedDup(ptrLstPedDup *ptrCabeza,ptrLstPedDup *ptrTalon);
int tienePedidos(int* pedidos,int sock);

#endif /* MANEJARPDD_H_ */
